package pascalcompiler.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Erisvaldo
 */
public class Escopo {

    private HashMap<String, Identificador> identificadores;
    private List<String> listaNomes = new ArrayList<String>();
    private Identificador procedimento;

    public Escopo() {
        identificadores = new HashMap<String, Identificador>();
    }

    public Identificador contains(String nome) throws Exception {
        return identificadores.get(nome);
    }

    public void add(String nome) throws Exception {
        if(identificadores.containsKey(nome) || listaNomes.contains(nome)) {
            print();
            throw new Exception("Identificador já declarado neste escopo: " + nome);
        }
        System.out.println("ADDED " + nome);

        listaNomes.add(nome);
    }
    
    public void add(String nome, Identificador id) throws Exception {
        if(identificadores.containsKey(nome)) {
            print();
            throw new Exception("Identificador já declarado neste escopo: " + nome);
        }

        System.out.println("FLUSH " + nome + " " + id.getTipo());

        procedimento = id;
        identificadores.put(nome, id);
        listaNomes.clear();
    }

    public Identificador flush(int natureza, int tipo) {
        Iterator<String> it = listaNomes.iterator();
        Identificador id = null;
        String nome;

        while(it.hasNext()) {
            nome = it.next();

            System.out.println("FLUSH " + nome + " " + natureza + " " + tipo);

            id = new Identificador(natureza, tipo);

            identificadores.put(nome, id);
        }

        if(natureza == Complicador.PARAM) {
            procedimento.addParametro(listaNomes.size(), tipo);
        }

        listaNomes.clear();

        return id;
    }

    public void print() {
        System.out.println("----ESCOPO----");
        
        Iterator<String> it = identificadores.keySet().iterator();
        while(it.hasNext()) {
            String id = it.next();
            System.out.println(id + " " + identificadores.get(id).getTipo());
        }

        System.out.println("--------------");
    }

}
